home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CD ROM Paradise Collection 4
/
CD ROM Paradise Collection 4 1995 Nov.iso
/
program
/
swagn_r.zip
/
NUMBERS.SWG
/
0033_More Get-Set Bits.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-11-02
|
3KB
|
120 lines
{
Robert Rothenburg
Here's some routines I wrote while playing around with some compression
algorithms. Since they're written in Pascal, they're probably not too
fast but they work.
Of course they're need some tweaking.
}
(* NoFrills Bit-Input/Output Routines *)
(* Insert "n" bits of data into a Buffer or Pull "n" bits of *)
(* data from a buffer. Useful for Compression routines *)
unit BitIO;
interface
const
BufferSize = 32767; (* Adjust as appropriate *)
type
Buffer = array [0..BufferSize] of byte;
BufPtr = ^Buffer;
BuffRec = record (* This was used for I/O by some *)
Block : BufPtr; (* other units involved with the *)
Size, (* compression stuff. Not so *)
Ptr : word; (* Important? *)
Loc : byte
end;
var
InBuffer,
OutBuffer : BuffRec;
InFile,
OutFile : file;
procedure InitBuffer(var x : BuffRec); (* Initialize a buffer *)
procedure GetBits(var b : word; num : byte); (* Get num bits from *)
(* InBuffer *)
procedure PutBits(b : word; num : byte); (* Put num bits into *)
(* OutBuffer *)
function Log2(x : word) : byte; (* Self-explanatory... *)
implementation
const
Power : array [1..17] of longint =
(1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536);
procedure InitBuffer(var x : BuffRec);
begin
with x do
begin
Loc := 8;
Ptr := 0;
Size := 0;
New(Block);
FillChar(Block^, BufferSize, #0);
end;
end;
procedure GetBits(var b : word; num : byte);
var
Size : word;
begin
with InBuffer do
begin
b := 0;
repeat
b := (b SHL 1);
if (Block^[Ptr] AND Power[Loc]) <> 0 then
b := b OR 1;
dec(Loc);
if Loc = 0 then
begin
Loc := 8;
inc(Ptr);
end;
dec(num);
until (num = 0);
end;
end;
procedure PutBits(b : word; num : byte);
var
i : byte;
begin
with OutBuffer do
repeat
if Loc = 0 then
begin
inc(Ptr);
Loc := 8;
end;
if (b AND Power[num]) <> 0 then
begin
Block^[Ptr] := Block^[Ptr] OR Power[Loc];
dec(Loc);
end
else
dec(Loc);
dec(num)
until num = 0;
OutBuffer.Size := succ(OutBuffer.Ptr);
end;
function Log2(x : word) : byte;
var
i : byte;
begin
i := 17;
while x<Power[i] do
dec(i);
Log2 := i;
end;
end.